﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using TVL;
using System.Xml;
using General;

namespace TVLL5A
{
    public class TecnicaHechizoL5A
    {
        private string _Nombre;
        private string _Descripcion;
        private int _Rango;
        private Anillo _Anillo;
        private const string _rutaxsd = "../../../TVLL5A/TecnicaHechizoL5A.xsd";
        private string _fallo;
        private Anillo toAnillo(string anillo)
        {
            if (anillo == "Fuego")
            {
                return Anillo.Fuego;
            }

            if (anillo == "Agua")
            {
                return Anillo.Agua;
            }

            if (anillo == "Aire")
            {
                return Anillo.Aire;
            }

            if (anillo == "Tierra")
            {
                return Anillo.Tierra;
            }

            return Anillo.Vacio;
        }

        public TecnicaHechizoL5A(string nombre, string desc, int rango, Anillo anillo)
        {
            _fallo = "No";
            this.Nombre = nombre;
            this.Descripcion = desc;
            this.Rango = rango;
            this.Anillo = anillo;
        }

        public TecnicaHechizoL5A(string ruta)
        {
            _fallo = "No";
            this.cargar(ruta);
        }

        public TecnicaHechizoL5A(XmlElement nodo)
        {
            _fallo = "No";
            this.cargar(nodo);
        }

        public string Nombre
        {
            get
            {
                return this._Nombre;
            }
            set
            {
                this._Nombre = value;
            }
        }

        public string Descripcion
        {
            get
            {
                return this._Descripcion;
            }
            set
            {
                this._Descripcion = value;
            }
        }

        public int Rango
        {
            get
            {
                return this._Rango;
            }
            set
            {
                this._Rango = value;
            }
        }

        public Anillo Anillo
        {
            get
            {
                return this._Anillo;
            }
            set
            {
                this._Anillo = value;
            }
        }

        public string Fallo
        {
            get { return this._fallo; }
        }

        public void toXTVL(XmlWriter mixml)
        {
            mixml.WriteStartElement("hechizo");
            mixml.WriteElementString("nombre", this.Nombre);
            mixml.WriteElementString("descripcion",this.Descripcion);
            mixml.WriteElementString("rango",this.Rango.ToString());
            mixml.WriteElementString("anillo", this.Anillo.ToString());
            mixml.WriteEndElement();

        }

        public bool cargar(string ruta)
        {
            XSDValidator validador = new XSDValidator(_rutaxsd, ruta);
            if (!validador.validar())
            {
                this._fallo = validador.Fallo;
                return false;
            }
            else
            {
                XmlDocument xtvl = new XmlDocument();
                xtvl.Load(ruta);
                XmlNodeList nombre = xtvl.GetElementsByTagName("nombre");
                XmlNodeList desc = xtvl.GetElementsByTagName("descripcion");
                XmlNodeList rango = xtvl.GetElementsByTagName("rango");
                XmlNodeList anillo = xtvl.GetElementsByTagName("anillo");

                this.Nombre = nombre[0].InnerText;
                this.Descripcion = desc[0].InnerText;
                this.Rango = Convert.ToInt32(rango[0].InnerText);
                this.Anillo = this.toAnillo(anillo[0].InnerText);
                return true;
            }
        }

        public bool cargar(XmlElement nodo)
        {
            try
            {
                XmlNodeList nombre = nodo.GetElementsByTagName("nombre");
                XmlNodeList desc = nodo.GetElementsByTagName("descripcion");
                XmlNodeList rango = nodo.GetElementsByTagName("rango");
                XmlNodeList anillo = nodo.GetElementsByTagName("anillo");

                this.Nombre = nombre[0].InnerText;
                this.Descripcion = desc[0].InnerText;
                this.Rango = Convert.ToInt32(rango[0].InnerText);
                this.Anillo = this.toAnillo(anillo[0].InnerText);
                return true;
            }
            catch(Exception ex)
            {
                this._fallo = ex.Message;
                return false;
            }
        }

        public bool guardar(string ruta)
        {
            XmlTextWriter mixml = new XmlTextWriter(ruta, System.Text.Encoding.UTF8);
            mixml.Formatting = System.Xml.Formatting.Indented;
            mixml.WriteStartDocument();
            this.toXTVL(mixml);
            mixml.WriteEndDocument();
            mixml.Close();
            XSDValidator validador = new XSDValidator(_rutaxsd, ruta);
            if (validador.validar())
            {
                return true;
            }
            else
            {
                if (System.IO.File.Exists(ruta))
                {
                    System.IO.File.Delete(ruta);
                }
                this._fallo = validador.Fallo;
                return false;
            }
        }
    }
}
